/*
    Estado        Metodo
    P           listarMicrositio() - Diego
    P           insertarMicrositio() - Diego
    P           modificarMicrositio() - Diego
    P           eliminarMicrositio() - Diego
    P           hayCampaniasConMicrositio() - Diego
    P           obtenerMicrositio() - Diego
    P           listarMicrositiosSinCampania() - Diego
 */
package dal;

import bd.BoundParam;
import bd.ConexionAvw;
import bd.ParamCallable;

import excepciones.AvwException;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.logging.Level;
import java.util.logging.Logger;

import negocio.MicrositioWeb;
import oracle.jdbc.driver.OracleTypes;

import util.Utiles;

public class MicrositioDAL {
    
    static final Logger logger = Utiles.iniciarLogger("MicrositioDAL", false);
    
    public MicrositioDAL() {
    }
    
    /**
     * Retorna todos los micrositios del sistema
     * @return ArrayList de MicrositioWeb
     */
    public static ArrayList<MicrositioWeb> listarMicrositios() throws AvwException {
        ArrayList<MicrositioWeb> sitios = new ArrayList<MicrositioWeb>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        
        sql.append("SELECT ");
        sql.append("msw_codigo, ");
        sql.append("msw_nombre, ");
        sql.append("msw_url, ");
        sql.append("msw_telefono ");
        sql.append("FROM ");
        sql.append("micro_sitio_web ");
        sql.append("ORDER BY msw_codigo ASC");
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql, null);
            
            while (rs.next()) {
                MicrositioWeb micrositioWeb = new MicrositioWeb();
                
                micrositioWeb.setMswCodigo(Utiles.noNull(rs.getString("msw_codigo")));
                micrositioWeb.setMswNombre(Utiles.noNull(rs.getString("msw_nombre").toLowerCase()));
                micrositioWeb.setMswUrl(Utiles.noNull(rs.getString("msw_url")));
                micrositioWeb.setMswTelefono(Utiles.noNull(rs.getString("msw_telefono")));
                
                sitios.add(micrositioWeb);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return sitios;
    }
    
    /**
     * Se inserta en el sistema el micrositio pasado por parametro.
     * @param micrositioWeb MicrositoWeb.
     */
    public static void insertarMicrositio(MicrositioWeb micrositioWeb)throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos = 0;

        sql.append("INSERT INTO ");
        sql.append("micro_sitio_web( ");
        sql.append("msw_nombre, ");
        sql.append("msw_url, ");
        sql.append("msw_telefono) ");
        sql.append("VALUES( ?,?,?)");
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswNombre()),java.sql.Types.VARCHAR));
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswUrl()),java.sql.Types.VARCHAR));
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswTelefono()),java.sql.Types.VARCHAR));
        
        try {
            conexion.abrirConexion();            
            conexion.executePreparedStatement(sql, params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Modifica en el sistema el micrositio con codigo pasado por parametro.
     * @param objeto MicrositioWeb.
     */
    public static void modificarMicrositio(MicrositioWeb micrositioWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos = 0;
        
        sql.append("UPDATE ");
        sql.append("micro_sitio_web ");
        sql.append("SET ");
        sql.append("msw_telefono = ? ");
        sql.append("WHERE ");
        sql.append("msw_codigo = ?");
        
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswTelefono()),java.sql.Types.VARCHAR));
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswCodigo()),java.sql.Types.NUMERIC));

        logger.info(sql.toString());
        
        //Conexion.get().startTransaction();
        try {
            conexion.abrirConexion();
            conexion.executePreparedStatement(sql, params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Se elimina el micrositio pasado por parametro
     * @param micrositioWeb MicrositioWeb (con solo el codigo).
     */
    public static void eliminarMicrositio(MicrositioWeb micrositioWeb) throws AvwException{
        StringBuilder sql = new StringBuilder();
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos = 0;
        
        sql.append("DELETE FROM ");
        sql.append("micro_sitio_web ");
        sql.append("WHERE ");
        sql.append(" msw_codigo = ? ");
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswCodigo()),java.sql.Types.VARCHAR));
        try {
            conexion.abrirConexion();
            logger.info(sql.toString());
            logger.info("elimino el micrositio " + micrositioWeb.getMswCodigo());
            conexion.executePreparedStatement(sql, params);
        } catch (SQLException e) {
            logger.log(Level.SEVERE,e.getMessage(),e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Verificar si hay campanias asociadas al micrositio
     * @param micrositioWeb
     */
    public static void hayCampaniasConMicrositio(MicrositioWeb micrositioWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        String camCodigo = "";
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos = 0;
        
        sql.append("SELECT ");
        sql.append("msw_codigo,  ");
        sql.append("cam_codigo ");
        sql.append("FROM ");
        sql.append("micro_sitio_web ");
        sql.append("WHERE ");
        sql.append("msw_codigo = ?");
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswCodigo()),java.sql.Types.NUMERIC));
        
        try {
            logger.info("Consulto Micrositio con campania ");
            logger.info(sql.toString());
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql, params);
            
            rs.next();
            camCodigo = rs.getString("cam_codigo");
            if (camCodigo == null){
                logger.log(Level.INFO, "No hay campania para ese micrositio");
                logger.info(sql.toString());
                throw new AvwException("No hay campania", true);
            }
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            logger.info(sql.toString());
            throw new AvwException(e.getMessage(), e, true);
            //out.println(e.getMessage());
        } finally {
            conexion.cerrarConexion();
        }
    }
    
    /**
     * Obtener un micrositio
     * @return el objeto MicrositioWeb a partir del codigo del objeto
     * MicrositioWeb pasado por parametro.
     * @param micrositioWeb MicrositioWeb (solo con el codigo).
     */
    public static MicrositioWeb obtenerMicrositio(MicrositioWeb micrositioWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos = 0;
        
        sql.append("SELECT ");
        sql.append("msw_codigo, ");
        sql.append("msw_nombre, ");
        sql.append("msw_url, ");
        sql.append("msw_telefono ");
        sql.append("FROM ");
        sql.append("micro_sitio_web ");
        sql.append("WHERE ");
        sql.append("msw_codigo = ?");
        params.add(new BoundParam(++pos,Utiles.noNull(micrositioWeb.getMswCodigo()),java.sql.Types.NUMERIC));
        
        try {
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql, params);
            
            rs.next();
            micrositioWeb.setMswCodigo(rs.getString("msw_codigo"));
            micrositioWeb.setMswNombre(rs.getString("msw_nombre"));
            micrositioWeb.setMswUrl(rs.getString("msw_url"));
            micrositioWeb.setMswTelefono(rs.getString("msw_telefono"));
            
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            conexion.cerrarConexion();
        }
        
        return micrositioWeb;
    }
    
    /**
     * Obtener los micrositos que no tienen asignados una campania
     * @return array de objetos MicrositioWeb
     */
    public static ArrayList<MicrositioWeb> listarMicrositiosSinCampanias() throws AvwException {
        ArrayList<MicrositioWeb> sitiosSinCampania = new ArrayList();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        
        sql.append("SELECT msw_codigo, msw_nombre, msw_url, cam_codigo ");
        sql.append("FROM micro_sitio_web ");
        
        try {
            logger.info("Consulto Micrositio sin campania? ");
            logger.info(sql.toString());
            conexion.abrirConexion();
            rs = conexion.getPreparedStatementResultSet(sql, null);
            
            while (rs.next()) {
                MicrositioWeb micrositioWeb = new MicrositioWeb();
                if (rs.getString("cam_codigo") == null){
                    micrositioWeb.setMswCodigo(rs.getString("msw_codigo"));
                    micrositioWeb.setMswNombre(rs.getString("msw_nombre"));
                    micrositioWeb.setMswUrl(rs.getString("msw_url"));
                    
                    sitiosSinCampania.add(micrositioWeb);
                }
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return sitiosSinCampania;
    }
    
    
    public static MicrositioWeb obtenerUltimoMicroInsertado()throws AvwException{
       
        StringBuilder sql = new StringBuilder();
        ConexionAvw c = new ConexionAvw();
        ArrayList<ParamCallable> params = new ArrayList<ParamCallable>();
        int pos = 0 ;
        MicrositioWeb micro = new MicrositioWeb();
        try {
            c.abrirConexion();
            params.add(new ParamCallable(++pos,null,OracleTypes.NUMERIC,ParamCallable.OUT));
            int codigoMicro = c.getIntCallableStatement("{call Micrositio.obtenerMicrositios (?)}",params,1);
             micro = new MicrositioWeb();
            micro.setMswCodigo(String.valueOf(--codigoMicro));
        } catch (SQLException ex) {
            throw new AvwException(ex.getMessage());
        }
        return micro;
    }
}
